home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 41.zip
/
BS1 part 41
/
STFX-soundsystemdisk.adf
/
sources
/
OBARSKIreplay.s
< prev
next >
Wrap
Text File
|
1988-01-20
|
8KB
|
347 lines
*************************************************
* testprog for replay-routine
* jump = start
* breakpoint = end
*************************************************
org $50000
load $50000
*************************************************
START: bsr START_MUZAK
main: btst #6,$bfe001
bne.s main
bsr STOP_MUZAK
clr.l d0
END: rts
;©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©
;© ©
;© The Ultimate Soundtracker Replay-Routine ©
;© Version 27 All bugs removed ©
;© Update 29.03.1988 ©
;© Written 1987/88 by Karsten Obarski ©
;© ©
;©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©
START_MUZAK:
move.l #data,muzakoffset ;** get offset
init0: move.l muzakoffset,a0 ;** get highest used pattern
add.l #472,a0
move.l #128,d0
clr.l d1
init1: move.l d1,d2
subq.w #1,d0
init2: move.b (a0)+,d1
cmp.b d2,d1
bgt init1
dbra d0,init2
addq.b #1,d2
init3: move.l muzakoffset,a0 ;** calc samplepointers
lea.l pointers,a1
mulu #1024,d2
add.l #600,d2
add.l a0,d2
move.l #15-1,d0
init4: move.l d2,(a1)+
clr.l d1
move.w 42(a0),d1
lsl.l #1,d1
add.l d1,d2
add.l #30,a0
dbra d0,init4
init5: move.w #$0,$dff0a8 ;** clear used values
move.w #$0,$dff0b8
move.w #$0,$dff0c8
move.w #$0,$dff0d8
clr.w timpos
clr.l trkpos
clr.l patpos
init6: move.l muzakoffset,a0 ;** initialize timer irq
move.b 470(a0),numpat+1 ;number of patterns
move.l #240,d0
sub.b 471(a0),d0
mulu #122,d0
move.b #$0,$bfde00
move.b d0,$bfd400
lsr.w #8,d0
move.b d0,$bfd500
move.b #$81,$bfdd00
move.b #$11,$bfde00
move.l $78,lev6save
move.l #lev6interrupt,$78
rts
STOP_MUZAK:
move.b #$1,$bfdd00 ;** restore timer & dma
move.l lev6save,$78
move.w #$0,$dff0a8
move.w #$0,$dff0b8
move.w #$0,$dff0c8
move.w #$0,$dff0d8
move.w #$f,$dff096
rts
lev6interrupt:
movem.l d0/d1,-(sp) ;** jump
bsr REPLAY_MUZAK
move.b $bfdd00,d0
move.w #$2000,$dff09c
movem.l (sp)+,d0/d1
rte
;------------------------------------------------
; replay-routine
;------------------------------------------------
REPLAY_MUZAK:
movem.l d0-d7/a0-a6,-(a7)
addq.w #1,timpos
cmp.w #6,timpos
beq replaystep
;------------------------------------------------
; time left to handle effects between steps
;------------------------------------------------
chaneleffects: ;** seek effects
lea.l datach0,a6
cmp.b #0,3(a6)
beq.s ceff1
lea.l $dff0a0,a5
bsr.s ceff5
ceff1: lea.l datach1,a6
cmp.b #0,3(a6)
beq.s ceff2
lea.l $dff0b0,a5
bsr.s ceff5
ceff2: lea.l datach2,a6
cmp.b #0,3(a6)
beq.s ceff3
lea.l $dff0c0,a5
bsr.s ceff5
ceff3: lea.l datach3,a6
cmp.b #0,3(a6)
beq.s ceff4
lea.l $dff0d0,a5
bsr.s ceff5
ceff4: movem.l (a7)+,d0-d7/a0-a6
rts
ceff5: move.b 2(a6),d0
and.b #$0f,d0
cmp.b #1,d0
beq arpreggiato
cmp.b #2,d0
beq pitchbend
rts
;------------------------------------------------
; effect 1 arpreggiato
;------------------------------------------------
arpreggiato: ;** spread by time
cmp.w #1,timpos
beq.s arp1
cmp.w #2,timpos
beq.s arp2
cmp.w #3,timpos
beq.s arp3
cmp.w #4,timpos
beq.s arp1
cmp.w #5,timpos
beq.s arp2
rts
arp1: clr.l d0 ;** get higher note-values
move.b 3(a6),d0 ; or play original
lsr.b #4,d0
bra.s arp4
arp2: clr.l d0
move.b 3(a6),d0
and.b #$0f,d0
bra.s arp4
arp3: move.w 16(a6),d2
bra.s arp6
arp4: lsl.w #1,d0
clr.l d1
move.w 16(a6),d1
lea.l notetable,a0
arp5: move.w (a0,d0.w),d2
cmp.w (a0),d1
beq.s arp6
addq.l #2,a0
bra.s arp5
arp6: move.w d2,6(a5)
rts
;------------------------------------------------
; effect 2 pitchbend
;------------------------------------------------
pitchbend: ;** increase or decrease
clr.l d0 ; period every time
move.b 3(a6),d0
lsr.b #4,d0
beq.s pit2
add.w d0,(a6)
move.w (a6),6(a5)
rts
pit2: clr.l d0
move.b 3(a6),d0
and.b #$0f,d0
beq.s pit3
sub.w d0,(a6)
move.w (a6),6(a5)
pit3: rts
;------------------------------------------------
; handle a further step of 16tel data
;------------------------------------------------
replaystep: ;** work next pattern-step
clr.w timpos
move.l muzakoffset,a0
move.l a0,a3
add.l #12,a3 ;ptr to soundprefs
move.l a0,a2
add.l #472,a2 ;ptr to pattern-table
add.l #600,a0 ;ptr to first pattern
clr.l d1
move.l trkpos,d0 ;get ptr to current pattern
move.b (a2,d0),d1
mulu #1024,d1
add.l patpos,d1 ;get ptr to current step
clr.w enbits
lea.l $dff0a0,a5 ;chanel 0
lea.l datach0,a6
bsr chanelhandler
lea.l $dff0b0,a5 ;chanel 1
lea.l datach1,a6
bsr chanelhandler
lea.l $dff0c0,a5 ;chanel 2
lea.l datach2,a6
bsr chanelhandler
lea.l $dff0d0,a5 ;chanel 3
lea.l datach3,a6
bsr chanelhandler
move.l #400,d0 ;** wait a while and set len
rep1: dbra d0,rep1 ; of oneshot to 1 word
move.l #$8000,d0
or.w enbits,d0
move.w d0,$dff096
cmp.w #1,datach0+14
bne.s rep2
clr.w datach0+14
move.w #1,$dff0a4
rep2: cmp.w #1,datach1+14
bne.s rep3
clr.w datach1+14
move.w #1,$dff0b4
rep3: cmp.w #1,datach2+14
bne.s rep4
clr.w datach2+14
move.w #1,$dff0c4
rep4: cmp.w #1,datach3+14
bne.s rep5
clr.w datach3+14
move.w #1,$dff0d4
rep5: add.l #16,patpos ;next step
cmp.l #64*16,patpos ;pattern finished ?
bne rep6
clr.l patpos
addq.l #1,trkpos ;next pattern in table
clr.l d0
move.w numpat,d0
cmp.l trkpos,d0 ;song finished ?
bne rep6
clr.l trkpos
rep6: movem.l (a7)+,d0-d7/a0-a6
rts
;------------------------------------------------
; proof chanel for actions
;------------------------------------------------
chanelhandler:
move.l (a0,d1.l),(a6) ;get period & action-word
addq.l #4,d1 ;point to next chanel
clr.l d2
move.b 2(a6),d2 ;get nibble for soundnumber
lsr.b #4,d2
beq chan2 ;no soundchange !
move.l d2,d4 ;** calc ptr to sample
lsl.l #2,d2
mulu #30,d4
lea.l pointers-4,a1
move.l 0(a1,d2.l),04(a6) ;store sample-address
move.w 0(a3,d4.l),08(a6) ;store sample-len in words
move.w 2(a3,d4.l),18(a6) ;store sample-volume
move.w 2(a3,d4.l),08(a5) ;change chanel-volume
clr.l d3
move.w 4(a3,d4),d3 ;** calc repeatstart
add.l 4(a6),d3
move.l d3,10(a6) ;store repeatstart
move.w 6(a3,d4),14(a6) ;store repeatlength
cmp.w #1,14(a6)
beq chan2 ;no sustainsound !
move.l 10(a6),4(a6) ;repstart = sndstart
move.w 6(a3,d4),8(a6) ;replength = sndlength
chan2: cmp.w #0,(a6)
beq chan4 ;no new note set !
move.w 22(a6),$dff096 ;clear dma
cmp.w #0,14(a6)
bne chan3 ;no oneshot-sample
move.w #1,14(a6) ;allow resume (later)
chan3: move.w (a6),16(a6) ;save note for effect
move.l 4(a6),0(a5) ;set samplestart
move.w 8(a6),4(a5) ;set samplelength
move.w 0(a6),6(a5) ;set period
move.w 22(a6),d0
or.w d0,enbits ;store dma-bit
move.w 18(a6),20(a6) ;volume trigger
chan4: rts
;------------------------------------------------
; used varibles
;------------------------------------------------
; datachx - structure (22 bytes)
;
; 00.w current note
; 02.b sound-number
; 03.b effect-number
; 04.l soundstart
; 08.w soundlenght in words
; 10.l repeatstart
; 14.w repeatlength
; 16.w last saved note
; 18.w volume
; 20.w volume trigger (note on dynamic)
; 22.w dma-bit
;------------------------------------------------
datach0: dc.w 0,0,0,0,0,0,0,0,0,0,0,1
datach1: dc.w 0,0,0,0,0,0,0,0,0,0,0,2
datach2: dc.w 0,0,0,0,0,0,0,0,0,0,0,4
datach3: dc.w 0,0,0,0,0,0,0,0,0,0,0,8
pointers: dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
notetable: dc.w 856,808,762,720,678,640,604,570
dc.w 538,508,480,453,428,404,381,360
dc.w 339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143
dc.w 135,127,120,113,000
muzakoffset: dc.l 0
lev6save: dc.l 0
trkpos: dc.l 0
patpos: dc.l 0
numpat: dc.w 0
enbits: dc.w 0
timpos: dc.w 0
data: blk.b 0,0